package com.itany.shop.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author 石小俊
 */
@WebListener
public class CountListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("***********正在创建session***********");
        // ServletContext对象的获取方式有两种
        // 1.如果是在Servlet中,可以直接调用GenericServlet提供的getServletContext()方法获取
        // 2.如果不在Servlet中,可以根据其他参数获取,主要是两种
        // 1.根据请求对象获取:request.getServletContext()
        // 2.根据session获取:session.getServletContext()
        ServletContext application = se.getSession().getServletContext();

        // 此时需要考虑到多人并发访问产生的线程安全问题
        synchronized (this) {
            // 先获取当前存储在application作用域中的人数信息
            Integer count = (Integer) application.getAttribute("count");
            // 判断是否是第一个访问的
            if (count == null) {
                // 如果是第一个,则初始值为1
                count = 1;
            } else {
                // 否则总人数+1
                count++;
            }
            // 每当创建session的时候,说明有人访问了网站,此时总人数+1
            application.setAttribute("count", count);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("***********正在销毁session***********");
        ServletContext application = se.getSession().getServletContext();
        synchronized (this) {
            Integer count = (Integer) application.getAttribute("count");
            count--;
            application.setAttribute("count", count);
        }
    }
}
